'''
功能：根据xlsx模型生成insert表语句大纲
'''
import pandas as pd
import datetime
from setting import (XLSX_PATH,OUTPUT_INSERT_DIR,SHEET_NAME)

file_path=XLSX_PATH
out_path = OUTPUT_INSERT_DIR
sheet_name=SHEET_NAME
# 分区字段
parttion_field=['p_provincecode','p_date','p_hour','p_month','p_week','p_year','p_quarter']
if not sheet_name: #列表为空，读取全量sheet数据
    data=pd.read_excel(file_path,sheet_name=None,header=0)
else:
    data=pd.read_excel(file_path,sheet_name=sheet_name,header=0)
creat_date=datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
# insert_sql模板
insert_sql='''--表名：{}
--create_time：{}
insert  overwrite table {} 
partition (
    {}
)
select
    {} 
from ;'''

#遍历所有sheet
for sheet_name,data in data.items():
    print(sheet_name)
    #打标是否是pdm字段
    is_pdm_field=False
    # 是否是表名
    is_table_name=False
    # 存储字段、字段类型、中文名、分区字段
    filed_name_type={}
    table_name=str()
    ch_table_name=str()
    p_name={}
    #遍历一个sheet
    for index,row in data.iterrows(): 
        filed_name=row.iloc[0]
        #print(filed_name)
        if(filed_name=='PDM字段英文名'):
            is_pdm_field=True
            continue
        elif row.iloc[1]=='目标表英文名':
            is_table_name=True
            continue
        elif(filed_name is None):
            is_pdm_field=False
            is_table_name=False
        if(is_pdm_field) and (row.iloc[0] not in parttion_field):
            #print(f'字段:{row.iloc[0]}，类型 {row.iloc[1]}，中文字段： {row.iloc[2]}')
            filed_name_type[index]=row.iloc[0]+","+row.iloc[1]+","+row.iloc[2]  # 字段，字段类型，字段中文名
        if(is_pdm_field) and (filed_name in parttion_field):
            p_name[index]=row.iloc[0] # 分区字段名
        if(is_table_name) and (len(table_name)==0):
            table_name=row.iloc[1] # 表名
            ch_table_name=row.iloc[2] # 中文表名
        
    # 遍历字段
    str_list=[]
    for key in sorted(filed_name_type.keys(),reverse=False): 
        str_list.append(filed_name_type[key].split(',')[0]+'  --'+filed_name_type[key].split(',')[2])
        # str_list.append(filed_name_type[key].split(',')[0])
    str_filed='\n    ,'.join(str_list)
    # 遍历分区字段
    p_name_list=[]
    for key,value in p_name.items():
        if(value=='p_provincecode'):
            p_name_list.append(value+'=${p_province}')
            pass
        elif(value=='p_date'):
            p_name_list.append(value+"='${p_date}'")
        else:
            p_name_list.append(value+'=${'+value+'}')
    str_p_name='\n    ,'.join(p_name_list)
    with open(out_path+'\\'+table_name+'.sql','w') as f:
        f.write(insert_sql.format(ch_table_name,creat_date,table_name, str_p_name, str_filed))
        f.close()
